using UnityEngine;

namespace DL.Tools
{
    public static class RectTransformExtensions
    {
        public static bool Overlaps(this RectTransform a, RectTransform b)
        {
            return a.WorldRect().Overlaps(b.WorldRect());
        }

        /// <summary>
        /// 判断矩形重叠
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="allowInverse">允许矩形宽高为负，false等同前者</param>
        /// <returns></returns>
        public static bool Overlaps(this RectTransform a, RectTransform b, bool allowInverse)
        {
            return a.WorldRect().Overlaps(b.WorldRect(), allowInverse);
        }

        public static Rect WorldRect(this RectTransform rectTransform)
        {
            // 获取 RectTransform 的 sizeDelta 属性，它表示 RectTransform 的尺寸与其子元素尺寸的差值
            Vector2 sizeDelta = rectTransform.sizeDelta;

            // 计算考虑缩放后的实际宽度
            var lossyScale = rectTransform.lossyScale;
            // sizeDelta.x 是 RectTransform 的宽度，lossyScale.x 是全局水平缩放因子
            float rectTransformWidth = sizeDelta.x * lossyScale.x;

            // 计算考虑缩放后的实际高度
            // sizeDelta.y 是 RectTransform 的高度，lossyScale.y 是全局垂直缩放因子
            float rectTransformHeight = sizeDelta.y * lossyScale.y;

            // 获取 RectTransform 在世界空间中的位置
            Vector3 position = rectTransform.position;

            // 创建一个新的 Rect 实例，表示 RectTransform 在世界空间中的矩形边界
            // Rect 的构造函数参数分别是 x 坐标，y 坐标，宽度，和高度
            var pivot = rectTransform.pivot;
            return new Rect(
                // 矩形左下角的 x 坐标：位置 x 减去宽度与水平锚点的乘积
                position.x - rectTransformWidth * pivot.x,
                // 矩形左下角的 y 坐标：位置 y 减去高度与垂直锚点的乘积
                position.y - rectTransformHeight * pivot.y,
                // 矩形的宽度
                rectTransformWidth,
                // 矩形的高度
                rectTransformHeight);
        }
    }
}
